package com.yangmf.auto_message_handle.utils;

import com.mikuac.shiro.core.Bot;
import com.mikuac.shiro.dto.action.response.UrlResp;
import com.mikuac.shiro.dto.event.notice.GroupUploadNoticeEvent;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Data
@Slf4j
@AllArgsConstructor
@Component
public class DownLoadUtil {
    /**
     * 处理CQ码中的图片URL
     * @param cqCode
     * @return
     */
    public String handleImageUrl(String cqCode) {
    // 匹配CQ码中的url参数
    Pattern pattern = Pattern.compile("url=([^,\\]]+)");
    Matcher matcher = pattern.matcher(cqCode);
    log.info("图片地址结果: " + matcher.group(1));
    if (matcher.find()) {
        String url = matcher.group(1);
        // 处理URL编码问题
        return url.replace("&amp;", "&");
    }
    return null;
}


/**
     * 从URL下载图片并保存到指定目录
     *
     * @param imageUrl 图片URL
     *
     *
     * @throws IOException
     * @throws InterruptedException
     */
    public   byte[] downloadImageFromUrl(String imageUrl) throws IOException, InterruptedException {
        // 创建 HttpClient 实例
        HttpClient httpClient = HttpClient.newHttpClient();

        // 构建 HTTP 请求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(imageUrl))
                .build();

        // 发送请求并获取响应
        HttpResponse<byte[]> response = httpClient.send(request,
                HttpResponse.BodyHandlers.ofByteArray());

        // 检查响应状态码
        if (response.statusCode() == 200) {
            // 获取响应体中的图片数据
            byte[] imageData = response.body();
            return imageData;

            // 创建保存目录

        } else {
            throw new IOException("下载失败，HTTP状态码: " + response.statusCode());
        }
    }


    /**
     * 处理文件上传事件
     *
     * @param bot
     * @param event
     * @param path
     */
    public   void  handleFileUpload(Bot bot, GroupUploadNoticeEvent event,String  path) {
        try {
            // 提取文件信息
            String fileId = event.getFile().getId();
            String fileName = event.getFile().getName();

            if (fileId == null || fileName == null) {
                bot.sendGroupMsg(event.getGroupId(), "无法解析文件信息", false);
                return;
            }

            // 获取文件下载链接
            UrlResp urlResp = bot.getGroupFileUrl(event.getGroupId(), fileId, 0).getData();

            // 下载实际文件内容
            byte[] fileData = downloadFileFromUrl(urlResp.getUrl());

            // 保存文件到本地
            saveFileToLocal(fileData, fileName, path);

            // 发送确认消息
            bot.sendGroupMsg(event.getGroupId(), "文件已接收并保存", false);

        } catch (Exception e) {
            e.printStackTrace();
            bot.sendGroupMsg(event.getGroupId(), "文件处理失败: " + e.getMessage(), false);
        }
    }

    public  byte[] downloadFileFromUrl(String url) throws IOException, InterruptedException {
        HttpClient httpClient = HttpClient.newHttpClient();
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(url))
                .build();

        HttpResponse<byte[]> response = httpClient.send(request,
                HttpResponse.BodyHandlers.ofByteArray());

        return response.body();
    }

    public  void saveFileToLocal(byte[] fileData, String fileName,String  path) throws IOException {
        // 创建保存目录
        Path saveDir = Paths.get(path);
        if (!Files.exists(saveDir)) {
            Files.createDirectories(saveDir);
        }

        // 保存文件
        Path filePath = saveDir.resolve(fileName);
        Files.write(filePath, fileData);
    }






    /**
     * 从腾讯文档URL中提取标题
     *
     * @param docUrl 腾讯文档的URL
     * @return 提取的标题，如果没有找到则返回null
     * @throws Exception 如果发生错误
     */
    public  String extractTitleFromTencentDoc(String docUrl) throws Exception {
        // 创建 HttpClient 实例
        HttpClient client = HttpClient.newHttpClient();

        // 构建 HTTP 请求
        HttpRequest request = HttpRequest.newBuilder()
                .uri(URI.create(docUrl))
                .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                .build();

        // 发送请求并获取响应
        HttpResponse<String> response = client.send(request,
                HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));

        // 检查响应状态
        if (response.statusCode() != 200) {
            throw new IOException("请求失败，状态码: " + response.statusCode());
        }

        // 获取页面内容
        String htmlContent = response.body();

        // 使用正则表达式提取标题
        Pattern titlePattern = Pattern.compile("<title>(.*?)</title>");
        Matcher matcher = titlePattern.matcher(htmlContent);

        if (matcher.find()) {
            return matcher.group(1);
        } else {
            throw new Exception("未能从页面中提取到标题");
        }
    }

    /**
     *
     * @param url
     * @return
     * TODD: 在那种夹带着图片的消息里面需要处理url，所以需要处理url
     */
    public String decodeUrl(String url) {
        if (url == null || url.isEmpty()) {
            return url;
        }
        // 处理常见的URL转义字符
        return url.replace("\\/", "/")
                .replace("&amp;", "&")
                .replace("\\:", ":")
                .replace("\\?", "?")
                .replace("\\=", "=")
                .replace("\\#", "#");
    }
    /**
     * 获取消息类型
     *
     * @param message 消息内容
     * @return 消息类型，1表示文件消息，2表示图片消息，3表示文本消息，4表示合并转发消息，5表示JSON消息，其他表示未知消息类型,6表示回复消息
     */
    public  int getMessageType(String message) {
        if (message == null || message.isEmpty()) {
            return 3; // 空消息当作文本类消息处理
        }

        if (message.startsWith("[CQ:file")) {
            return 1;
        } else if (message.startsWith("[CQ:image")) {
            return 2;
        } else if (message.startsWith("[CQ:forward")) {
            return 4;
        } else if (message.startsWith("[CQ:json")) {
            return 5;
        } else if(message.startsWith("[CQ:reply"))
        {
            return 6;
        }
        else {
            return 3; // 默认文本类消息
        }
    }

    /**
     * 判断是否为腾讯文档
     * @param message
     * @return
     */
    public Boolean isTencentDoc(String message)
    {
        return message.startsWith("[CQ:json") && message.contains("腾讯文档");
    }
    public String extractNameFromCQImage(String cqImage) {
        if (cqImage == null || !cqImage.startsWith("[CQ:image")) {
            return null;
        }

        // 使用正则表达式匹配file参数
        Pattern pattern = Pattern.compile("file=([^.]+\\.[^,\\]]+)");
        Matcher matcher = pattern.matcher(cqImage);

        if (matcher.find()) {
            return matcher.group(1);
        }

        return null;
    }


    /**
     * 从CQ回复消息中提取ID
     * @param cqReply CQ回复消息字符串
     * @return ID值，如果无法提取则返回null
     */
    public String extractIdFromCQReply(String cqReply) {
        if (cqReply == null || !cqReply.startsWith("[CQ:reply")) {
            return null;
        }

        // 使用正则表达式匹配id参数
        Pattern pattern = Pattern.compile("id=(\\d+)");
        Matcher matcher = pattern.matcher(cqReply);

        if (matcher.find()) {
            return matcher.group(1);
        }

        return null;
    }
    /**
     * 从CQ回复消息中提取回复内容
     * @param cqReply CQ回复消息字符串
     * @return 回复内容，如果无法提取则返回null
     */
    public String extractContentFromCQReply(String cqReply) {
        if (cqReply == null || !cqReply.startsWith("[CQ:reply")) {
            return null;
        }

        // 查找第一个']'后面的内容作为回复内容
        int endIndex = cqReply.indexOf(']');
        if (endIndex != -1 && endIndex < cqReply.length() - 1) {
            return cqReply.substring(endIndex + 1);
        }

        return null;
    }


}

